home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Visual Database / Visual Foxpro 6.0 (Ent. Edition) / Vf6ent Extractor.EXE / TOOLS / TRANSFRM / TRANSFRM.PRG < prev    next >
Encoding:
Text File  |  1998-05-26  |  30.8 KB  |  1,178 lines

  1. * TRANSFRM.PRG - Transformer.
  2. *
  3. * Copyright (c) 1996 Microsoft Corp.
  4. * 1 Microsoft Way
  5. * Redmond, WA 98052
  6. *
  7. * Description:
  8. * Transformer for PJX/VCX/SCX files.
  9. *
  10.  
  11. #INCLUDE "transfrm.h"
  12.  
  13. LPARAMETERS tcFormClass,tcTransformClass
  14. LOCAL lcFormClass,lcTransformClass,lcFormClassLibrary,lcTransformClass
  15. LOCAL oForm,lcProgramName,lnAtPos,llAbort
  16. LOCAL lcLastSetClassLib,lcLastSetProcedure
  17. LOCAL lcLastSetTalk,lcLastSetESC,lcLastSetUDFParms
  18. LOCAL laInstances[1]
  19.  
  20. lcLastSetTalk=SET('TALK')
  21. SET TALK OFF
  22. lcLastSetESC=SET('ESCAPE')
  23. SET ESCAPE OFF
  24. lcLastSetUDFParms=SET('UDFPARMS')
  25. SET UDFPARMS VALUE
  26. SET COLLATE TO 'MACHINE'
  27. llAbort=.F.
  28. lcProgramName=LOWER(SYS(16))
  29. lcLastSetClassLib=SET('CLASSLIB')
  30. lcLastSetProcedure=SET('PROCEDURE')
  31. lcFormClass=IIF(TYPE('tcFormClass')#'C' OR EMPTY(tcFormClass), ;
  32.         'Transformer',tcFormClass)
  33. lcTransformClass=IIF(TYPE('tcTransformClass')#'C' OR ;
  34.         EMPTY(tcTransformClass),'TransformFiles',tcTransformClass)
  35. lcFormClassLibrary=LOWER(FULLPATH('transfrm',lcProgramName))
  36. lcTransformClassLibrary=''
  37. SET CLASSLIB TO (lcFormClassLibrary) ADDITIVE
  38. lnAtPos=AT(',',lcFormClass)
  39. IF lnAtPos>0
  40.     lcFormClassLibrary=LOWER(ALLTRIM(MLINE(LEFT(lcFormClass,lnAtPos-1),1)))
  41.     IF NOT '.'$lcFormClassLibrary
  42.         lcFormClassLibrary=lcFormClassLibrary+'.vcx'
  43.     ENDIF
  44.     lcFormClass=LOWER(ALLTRIM(SUBSTR(lcFormClass,lnAtPos+1)))
  45.     IF NOT FILE(lcFormClassLibrary)
  46.         =FileNotFoundMsg(lcFormClassLibrary)
  47.         llAbort=.T.
  48.     ENDIF
  49. ENDIF
  50. lnAtPos=AT(',',lcTransformClass)
  51. IF lnAtPos>0
  52.     lcTransformClassLibrary=LOWER(ALLTRIM(MLINE(LEFT(lcTransformClass,lnAtPos-1),1)))
  53.     IF NOT '.'$lcTransformClassLibrary
  54.         lcTransformClassLibrary=lcTransformClassLibrary+'.vcx'
  55.     ENDIF
  56.     lcTransformClass=LOWER(ALLTRIM(SUBSTR(lcTransformClass,lnAtPos+1)))
  57.     IF NOT FILE(lcTransformClassLibrary)
  58.         =FileNotFoundMsg(lcTransformClassLibrary)
  59.         llAbort=.T.
  60.     ENDIF
  61. ENDIF
  62. IF lcFormClassLibrary==lcTransformClassLibrary
  63.     lcTransformClassLibrary=''
  64. ENDIF
  65. IF NOT llAbort AND AINSTANCE(laInstances,lcFormClass)=0
  66.     IF RIGHT(lcFormClassLibrary,4)=='.prg'
  67.         SET PROCEDURE TO (lcFormClassLibrary) ADDITIVE
  68.     ELSE
  69.         SET CLASSLIB TO (lcFormClassLibrary) ADDITIVE
  70.     ENDIF
  71.     oForm=CREATEOBJECT(lcFormClass)
  72.     IF TYPE('oForm')#'O'
  73.         llAbort=.T.
  74.     ENDIF
  75.     IF NOT llAbort AND TYPE('oForm.oTransform')=='U'
  76.         IF NOT EMPTY(lcTransformClassLibrary)
  77.             IF RIGHT(lcTransformClassLibrary,4)=='.prg'
  78.                 SET PROCEDURE TO (lcTransformClassLibrary) ADDITIVE
  79.             ELSE
  80.                 SET CLASSLIB TO (lcTransformClassLibrary) ADDITIVE
  81.             ENDIF
  82.         ENDIF
  83.         oForm.AddObject('oTransform',lcTransformClass)
  84.         oForm.oTransform.Name='oTransform'
  85.         IF TYPE('oForm.oTransform')#'O'
  86.             llAbort=.T.
  87.         ENDIF
  88.     ENDIF
  89.     IF NOT SET('CLASSLIB')==lcLastSetClassLib
  90.         IF NOT RIGHT(lcFormClassLibrary,4)=='.prg'
  91.             RELEASE CLASSLIB (lcFormClassLibrary)
  92.         ENDIF
  93.         IF NOT EMPTY(lcTransformClassLibrary) AND ;
  94.                 NOT RIGHT(lcTransformClassLibrary,4)=='.prg'
  95.             RELEASE CLASSLIB (lcTransformClassLibrary)
  96.         ENDIF
  97.     ENDIF
  98.     IF NOT SET('PROCEDURE')==lcLastSetProcedure
  99.         IF RIGHT(lcFormClassLibrary,4)=='.prg'
  100.             RELEASE PROCEDURE (lcFormClassLibrary)
  101.         ENDIF
  102.         IF NOT EMPTY(lcTransformClassLibrary) AND ;
  103.                 RIGHT(lcTransformClassLibrary,4)=='.prg'
  104.             RELEASE PROCEDURE (lcTransformClassLibrary)
  105.         ENDIF
  106.     ENDIF
  107.     IF NOT llAbort
  108.         oForm.Show()
  109.     ENDIF
  110. ENDIF
  111. IF TYPE('lcLastSetUDFParms')=='C' AND lcLastSetUDFParms=='REFERENCE'
  112.     SET UDFPARMS REFERENCE
  113. ELSE
  114.     SET UDFPARMS VALUE
  115. ENDIF
  116. IF TYPE('lcLastSetESC')=='C' AND lcLastSetESC=='ON'
  117.     SET ESCAPE ON
  118. ELSE
  119.     SET ESCAPE OFF
  120. ENDIF
  121. IF TYPE('lcLastSetTalk')=='C' AND lcLastSetTalk=='ON'
  122.     SET TALK ON
  123. ELSE
  124.     SET TALK OFF
  125. ENDIF
  126. IF TYPE('llAbort')#'L'
  127.     RETURN .T.
  128. ENDIF
  129. RETURN llAbort
  130.  
  131.  
  132.  
  133. FUNCTION ShowMsgBox
  134. LPARAMETERS tcMessage,tnType,tcTitle
  135. LOCAL lcMessage,lnResult,lnType,lcTitle
  136.  
  137. lcMessage=IIF(TYPE('tcMessage')=='C',tcMessage,'')
  138. lnType=IIF(TYPE('tnType')=='N',tnType,48)
  139. lcTitle=IIF(TYPE('tcTitle')=='C',tcTitle,'Visual FoxPro Transformer')
  140. WAIT CLEAR
  141. lnResult=MESSAGEBOX(lcMessage,lnType,lcTitle)
  142. RETURN lnResult
  143.  
  144.  
  145.  
  146. FUNCTION FileNotFoundMsg
  147. LPARAMETERS tcFileName
  148.  
  149. RETURN ShowMsgBox(FILENOTFOUND1_LOC +LOWER(tcFileName)+FILENOTFOUND2_LOC)
  150.  
  151.  
  152.  
  153. DEFINE CLASS TransformFiles AS Custom
  154.  
  155.  
  156.     Name='oTransformFiles'
  157.     PROTECTED lAddFontRules
  158.     cGetFileExt='pjx|scx|vcx'
  159.     PROTECTED cText
  160.     cText=''
  161.     PROTECTED cFileName
  162.     cFileName=''
  163.     PROTECTED lSearchSubfolders
  164.     PROTECTED lCreateLogOnly
  165.     PROTECTED lLogToFile
  166.     PROTECTED cLogToFile
  167.     cLogToFile=''
  168.     PROTECTED nStartSeconds
  169.     nStartSeconds=0
  170.     PROTECTED nEndSeconds
  171.     nEndSeconds=0
  172.     PROTECTED aProcessedFiles[1]
  173.     PROTECTED nProcessedFileCount
  174.     nProcessedFileCount=0
  175.     PROTECTED nTransformedFileCount
  176.     nTransformedFileCount=0
  177.     PROTECTED nFileCount
  178.     nFileCount=0
  179.     PROTECTED aFileList[1]
  180.     PROTECTED nRuleCount
  181.     nRuleCount=0
  182.     PROTECTED aRules[1]
  183.     PROTECTED aFileRule[1]
  184.     PROTECTED nFileRuleCount
  185.     nFileRuleCount=0
  186.     PROTECTED lOverridePropertyDefaults
  187.     PROTECTED aExcludeFilesRule[1]
  188.     PROTECTED aClassRule[1]
  189.     PROTECTED nClassRuleCount
  190.     nClassRuleCount=0
  191.     PROTECTED aExcludeClassesRule[1]
  192.     PROTECTED lLastLockScreen
  193.     PROTECTED nFontMatchCount
  194.     nFontMatchCount=0
  195.  
  196.  
  197.     FUNCTION Do(tlAddFontRules)
  198.     LOCAL lcMsg
  199.  
  200.     this.parent.lError=.F.
  201.     this.lLastLockScreen=this.parent.LockScreen
  202.     this.lAddFontRules=tlAddFontRules
  203.     this.lSearchSubfolders=this.parent.pgfTransformer. ;
  204.             fpgFiles.chkSearchSubfolders.Value
  205.     this.lCreateLogOnly=this.parent.pgfTransformer. ;
  206.             fpgFiles.chkCreateLogOnly.Value
  207.     this.lLogToFile=this.parent.pgfTransformer. ;
  208.             fpgFiles.chkLogToFile.Value
  209.     this.cLogToFile=ALLTRIM(this.parent.pgfTransformer. ;
  210.             fpgFiles.txtLogToFile.Value)
  211.     this.nFileCount=this.parent.pgfTransformer.fpgFiles. ;
  212.             lstSelectedFiles.ListCount
  213.     IF this.nFileCount=0
  214.         this.NoFilesErrorMsg()
  215.         RETURN ''
  216.     ENDIF
  217.     IF NOT this.lAddFontRules AND NOT this.lCreateLogOnly AND ;
  218.             ShowMsgBox(ALTERFILES_LOC,289)#1
  219.         RETURN ''
  220.     ENDIF
  221.     this.nStartSeconds=SECONDS()
  222.     ACTIVATE SCREEN
  223.     this.InitalizeRules()
  224.     this.ProcessStart()
  225.     IF NOT this.ProcessFileList() OR this.parent.lError
  226.         this.AddText('',1)
  227.         IF this.parent.lError
  228.             this.AddText(ABORT1_LOC,1)
  229.         ELSE
  230.             this.AddText(ABORT2_LOC,1)
  231.         ENDIF
  232.     ENDIF
  233.     this.nEndSeconds=SECONDS()
  234.     IF NOT RIGHT(this.cText,2)==(CR+CR)
  235.         this.AddText('',1)
  236.     ENDIF
  237.     DO CASE
  238.         CASE this.nTransformedFileCount=0
  239.             this.AddText(NOFILES_LOC)
  240.         CASE this.nTransformedFileCount=1
  241.             this.AddText(HAS1FILE_LOC)
  242.         OTHERWISE
  243.             this.AddText(ALLTRIM(STR(this.nTransformedFileCount))+HASMANYFILE_LOC)
  244.     ENDCASE
  245.     this.AddText(' '+IIF(this.lCreateLogOnly,SCANNED_LOC,PROCESSED_LOC)+' in '+ ;
  246.             ALLTRIM(STR(ABS(this.nEndSeconds-this.nStartSeconds),9,3))+ ;
  247.             SECONDS_LOC,1)
  248.     this.ProcessEnd()
  249.     this.DisplayText()
  250.     this.parent.lError=.F.
  251.     this.parent.Refresh()
  252.     this.parent.LockScreen=this.lLastLockScreen
  253.     CLEAR TYPEAHEAD
  254.     IF this.lAddFontRules
  255.         WAIT CLEAR
  256.         lcMsg=IIF(this.nFontMatchCount=0,NOFONTRULE_LOC, ;
  257.                 ALLTRIM(STR(this.nFontMatchCount))+FONTRULE1_LOC+ ;
  258.                 IIF(this.nFontMatchCount=1,'','s'))+FONTRULE2_LOC
  259.             ShowMsgBox(lcMsg,64,FONTRULE3_LOC)
  260.         RETURN ''
  261.     ENDIF
  262.     this.parent.pgfTransformer.fpgLog.edtTransformerLog.SetFocus()
  263.     KEYBOARD '{DNARROW}' PLAIN
  264.     RETURN this.cText
  265.     ENDFUNC
  266.     
  267.     
  268.     FUNCTION WildCardMatch(tcMatchExpList,tcExpressionSearched)
  269.     LOCAL lcMatchExpList,lcMatchExp,lcExpressionSearched
  270.     LOCAL lnMatchLen,lnExpressionLen,lnMatchCount,lnCount,lnCount2,lnAtPos
  271.  
  272.     IF EMPTY(tcExpressionSearched)
  273.         RETURN .F.
  274.     ENDIF
  275.     lcExpressionSearched=LOWER(ALLTRIM(tcExpressionSearched))
  276.     lnExpressionLen=LEN(lcExpressionSearched)
  277.     lcMatchExpList=LOWER(ALLTRIM(tcMatchExpList))
  278.     lnMatchCount=OCCURS(',',lcMatchExpList)+1
  279.     IF lnMatchCount>1
  280.         lcMatchExpList=','+ALLTRIM(lcMatchExpList)+','
  281.     ENDIF
  282.     FOR lnCount = 1 TO lnMatchCount
  283.         IF lnMatchCount=1
  284.             lcMatchExp=LOWER(ALLTRIM(lcMatchExpList))
  285.             lnMatchLen=LEN(lcMatchExp)
  286.         ELSE
  287.             lnAtPos=AT(',',lcMatchExpList,lnCount)
  288.             lnMatchLen=AT(',',lcMatchExpList,lnCount+1)-lnAtPos-1
  289.             lcMatchExp=LOWER(ALLTRIM(SUBSTR(lcMatchExpList,lnAtPos+1, ;
  290.                     lnMatchLen)))
  291.         ENDIF
  292.         FOR lnCount2 = 1 TO OCCURS('?',lcMatchExp)
  293.             lnAtPos=AT('?',lcMatchExp)
  294.             IF lnAtPos>lnExpressionLen
  295.                 IF (lnAtPos-1)=lnExpressionLen
  296.                     lcExpressionSearched=lcExpressionSearched+'?'
  297.                 ENDIF
  298.                 EXIT
  299.             ENDIF
  300.             lcMatchExp=STUFF(lcMatchExp,lnAtPos,1, ;
  301.                     SUBSTR(lcExpressionSearched,lnAtPos,1))
  302.         ENDFOR
  303.         IF EMPTY(lcMatchExp) OR lcExpressionSearched==lcMatchExp OR ;
  304.                 lcMatchExp=='*' OR lcMatchExp=='?' OR lcMatchExp=='%%'
  305.             RETURN
  306.         ENDIF
  307.         IF LEFT(lcMatchExp,1)=='*'
  308.             RETURN (SUBSTR(lcMatchExp,2)==RIGHT(lcExpressionSearched, ;
  309.                     LEN(lcMatchExp)-1))
  310.         ENDIF
  311.         IF LEFT(lcMatchExp,1)=='%' AND RIGHT(lcMatchExp,1)=='%' AND ;
  312.                 SUBSTR(lcMatchExp,2,lnMatchLen-2)$lcExpressionSearched
  313.             RETURN
  314.         ENDIF
  315.         lnAtPos=AT('*',lcMatchExp)
  316.         IF lnAtPos>0 AND (lnAtPos-1)<=lnExpressionLen AND ;
  317.                 LEFT(lcExpressionSearched,lnAtPos-1)==LEFT(lcMatchExp, ;
  318.                         lnAtPos-1)
  319.             RETURN
  320.         ENDIF
  321.     ENDFOR
  322.     RETURN .F.
  323.     ENDFUNC
  324.  
  325.  
  326.     FUNCTION TrimPath(tcFileName,tlTrimExt)
  327.     LOCAL lcFileName,lnAtPos
  328.  
  329.     IF EMPTY(tcFileName)
  330.         RETURN ''
  331.     ENDIF
  332.     lcFileName=tcFileName
  333.     lnAtPos=AT(':',lcFileName)
  334.     IF lnAtPos>0
  335.         lcFileName=SUBSTR(lcFileName,lnAtPos+1)
  336.     ENDIF
  337.     IF tlTrimExt
  338.         lcFileName=this.TrimExt(lcFileName)
  339.     ENDIF
  340.     lcFileName=ALLTRIM(SUBSTR(lcFileName,AT('\',lcFileName,;
  341.             MAX(OCCURS('\',lcFileName),1))+1))
  342.     DO WHILE LEFT(lcFileName,1)=='.'
  343.         lcFileName=ALLTRIM(SUBSTR(lcFileName,2))
  344.     ENDDO
  345.     DO WHILE RIGHT(lcFileName,1)=='.'
  346.         lcFileName=ALLTRIM(LEFT(lcFileName,LEN(lcFileName)-1))
  347.     ENDDO
  348.     RETURN lcFileName
  349.     ENDFUNC
  350.  
  351.  
  352.     FUNCTION TrimExt(tcFileName)
  353.     LOCAL lcFileName,lnAtPos,lnAtPos2
  354.  
  355.     lcFileName=tcFileName
  356.     lnAtPos=RAT('.',lcFileName)
  357.     IF lnAtPos>0
  358.         lnAtPos2=RAT(':',lcFileName)
  359.         IF lnAtPos>lnAtPos2
  360.             lcFileName=LEFT(lcFileName,lnAtPos-1)
  361.         ENDIF
  362.     ENDIF
  363.     RETURN ALLTRIM(lcFileName)
  364.     ENDFUNC
  365.  
  366.  
  367.     PROTECTED FUNCTION Error(tnError,tcMethod,tnLine)
  368.  
  369.     RETURN thisform.Error(tnError,tcMethod,tnLine,this)
  370.     ENDFUNC
  371.  
  372.  
  373.     PROTECTED FUNCTION FormatValue(tcProperty,tcValue)
  374.     LOCAL lcValue,lcType
  375.  
  376.     lcType=TYPE('tcValue')
  377.     DO CASE
  378.         CASE lcType=='C'
  379.             =.F.
  380.         CASE lcType=='U'
  381.             RETURN tcValue
  382.         CASE lcType=='L'
  383.             tcValue=IIF(tcValue,'.T.','.F.')
  384.         CASE lcType=='N'
  385.             tcValue=ALLTRIM(STR(tcValue))
  386.         CASE lcType=='D'
  387.             tcValue=DTOC(tcValue)
  388.         CASE lcType=='T'
  389.             tcValue=TTOC(tcValue)
  390.         CASE lcType=='Y'
  391.             tcValue=ALLTRIM(STR(MTON(tcValue)))
  392.         OTHERWISE
  393.             RETURN tcValue
  394.     ENDCASE
  395.     lcType=TYPE(tcValue)
  396.     DO CASE
  397.         CASE lcType=='N' OR lcType=='D' OR lcType=='T'
  398.             lcValue=ALLTRIM(tcValue)
  399.         CASE lcType=='L'
  400.             lcValue=IIF(EVALUATE(tcValue),'.T.','.F.')
  401.         CASE EMPTY(tcValue)
  402.             lcValue=ALLTRIM(tcValue)
  403.         CASE LEFT(tcValue,1)=='='
  404.             lcValue='('+SUBSTR(tcValue,2)+')'
  405.         CASE NOT LEFT(tcValue,1)=='"' AND ;
  406.                 INLIST(tcProperty,'caption','tag','comment','name','fontname', ;
  407.                 'controlsource','recordsource','format','inputmask', ;
  408.                 'statusbartext','tooltiptext','memowindow','passwordchar', ;
  409.                 'columnwidths','rowsource','lineslant','childorder') OR ;
  410.                 INLIST(tcProperty,'linkmaster','dynamicbackcolor', ;
  411.                 'dynamicforecolor','dynamicfontbold','dynamicfontitalic', ;
  412.                 'dynamicfontname','dynamicfontoutline','dynamicfontsize', ;
  413.                 'dynamicfontshadow','dynamicfontstrikethru', ;
  414.                 'dynamicfontunderline','dynamicalignment', ;
  415.                 'dynamiccurrentcontrol','hostname','relationalexpr')
  416.             lcValue='"'+tcValue+'"'
  417.         OTHERWISE
  418.             lcValue=ALLTRIM(tcValue)
  419.     ENDCASE
  420.     RETURN lcValue
  421.     ENDFUNC
  422.  
  423.  
  424.     PROTECTED FUNCTION DisplayMessage(tcText)
  425.     
  426.     IF ISNULL(tcText)
  427.         SET MESSAGE TO
  428.         RETURN
  429.     ENDIF
  430.     IF EMPTY(tcText)
  431.         SET MESSAGE TO SCANNING_LOC
  432.         RETURN
  433.     ENDIF
  434.     SET MESSAGE TO SCANNING2_LOC+tcText
  435.     ENDFUNC
  436.  
  437.  
  438.     PROTECTED FUNCTION NoFilesErrorMsg
  439.     RETURN ShowMsgBox(NOFILESTOPROCESS_LOC,,this.parent.Caption)
  440.     ENDFUNC
  441.     
  442.     
  443.     PROTECTED FUNCTION ClearText
  444.     
  445.     IF this.lAddFontRules
  446.         RETURN .F.
  447.     ENDIF
  448.     this.cText=''
  449.     ENDFUNC
  450.  
  451.  
  452.     PROTECTED FUNCTION AddText(tcText,tnLines)
  453.     LOCAL lnLines
  454.     
  455.     IF this.lAddFontRules
  456.         RETURN .F.
  457.     ENDIF
  458.     lnLines=IIF(TYPE('tnLines')=='N',tnLines,0)
  459.     this.cText=this.cText+tcText+REPLICATE(CR,lnLines)
  460.     ENDFUNC
  461.     
  462.     
  463.     PROTECTED FUNCTION LogToFile
  464.     LOCAL lcFileName
  465.  
  466.     IF this.lAddFontRules
  467.         RETURN .F.
  468.     ENDIF
  469.     lcFileName=this.cLogToFile
  470.     IF NOT this.lLogToFile OR EMPTY(lcFileName)
  471.         RETURN .F.
  472.     ENDIF
  473.     SET TEXTMERGE OFF
  474.     SET TEXTMERGE TO (lcFileName)
  475.     IF NOT FILE(lcFileName)
  476.         SET TEXTMERGE OFF
  477.         RETURN .F.
  478.     ENDIF
  479.     SET TEXTMERGE ON NOSHOW
  480.     TEXT
  481.     <<this.cText+CR>>
  482.     ENDTEXT
  483.     SET TEXTMERGE OFF
  484.     SET TEXTMERGE TO
  485.     ENDFUNC
  486.  
  487.  
  488.     PROTECTED FUNCTION HeaderText
  489.  
  490.     this.TitleText(LOGSTART_LOC)
  491.     this.LineBreakText()
  492.     ENDFUNC
  493.     
  494.  
  495.     PROTECTED FUNCTION FooterText
  496.  
  497.     this.LineBreakText()
  498.     this.TitleText(LOGEND_LOC)
  499.     ENDFUNC
  500.     
  501.  
  502.     PROTECTED FUNCTION TitleText(tcText)
  503.  
  504.     this.AddText('*** '+tcText+' ***  '+TTOC(DATETIME()),1)
  505.     ENDFUNC
  506.  
  507.  
  508.     PROTECTED FUNCTION UnableToProcessFileText(tcFileName)
  509.  
  510.     this.AddText(NOPROCESS_LOC+tcFileName,1)
  511.     ENDFUNC
  512.  
  513.  
  514.     PROTECTED FUNCTION LineBreakText
  515.  
  516.     this.AddText(REPLICATE('_',65),2)
  517.     ENDFUNC
  518.     
  519.  
  520.     PROTECTED FUNCTION DisplayText
  521.  
  522.     IF this.lAddFontRules
  523.         RETURN .F.
  524.     ENDIF
  525.     this.parent.pgfTransformer.fpgLog.edtTransformerLog.Value=this.cText
  526.     ENDFUNC
  527.     
  528.  
  529.     PROTECTED FUNCTION InitalizeRules
  530.     LOCAL lcItem,lnCount,lcFiles,lcClasses
  531.  
  532.     this.nRuleCount=this.parent.pgfTransformer.fpgRules.lstSelectedRules. ;
  533.             ListCount
  534.     DIMENSION this.aRules[MAX(this.nRuleCount,1)]
  535.     this.aRules=''
  536.     this.nFileRuleCount=0
  537.     DIMENSION this.aFileRule[1]
  538.     this.aFileRule=''
  539.     DIMENSION this.aExcludeFilesRule[1]
  540.     this.aExcludeFilesRule=.F.
  541.     this.nClassRuleCount=0
  542.     DIMENSION this.aClassRule[1]
  543.     this.aClassRule=''
  544.     DIMENSION this.aExcludeClassesRule[1]
  545.     this.aExcludeClassesRule=.F.
  546.     this.lOverridePropertyDefaults=.F.
  547.     FOR lnCount = 1 TO this.nRuleCount
  548.         lcItem=this.parent.pgfTransformer.fpgRules. ;
  549.                 lstSelectedRules.List[lnCount]
  550.         this.aRules[lnCount]=lcItem
  551.         this.parent.GetRule(lcItem)
  552.         IF NOT EMPTY(this.parent.aRule[1])
  553.             LOOP
  554.         ENDIF
  555.         lcFiles=LOWER(this.parent.aRule[4])
  556.         lcClasses=LOWER(this.parent.aRule[6])
  557.         IF NOT EMPTY(lcFiles)
  558.             this.nFileRuleCount=this.nFileRuleCount+1
  559.             DIMENSION this.aFileRule[this.nFileRuleCount]
  560.             DIMENSION this.aExcludeFilesRule[this.nFileRuleCount]
  561.             this.aFileRule[this.nFileRuleCount]=lcFiles
  562.             this.aExcludeFilesRule[this.nFileRuleCount]=this.parent.aRule[5]
  563.         ENDIF
  564.         IF NOT EMPTY(lcClasses)
  565.             this.nClassRuleCount=this.nClassRuleCount+1
  566.             DIMENSION this.aClassRule[this.nClassRuleCount]
  567.             DIMENSION this.aExcludeClassesRule[this.nClassRuleCount]
  568.             this.aClassRule[this.nClassRuleCount]=lcClasses
  569.             this.aExcludeClassesRule[this.nClassRuleCount]=this.parent.aRule[7]
  570.         ENDIF
  571.         IF this.parent.aRule[8]
  572.             this.lOverridePropertyDefaults=.T.
  573.         ENDIF
  574.     ENDFOR
  575.     this.nFontMatchCount=0
  576.     ENDFUNC
  577.  
  578.  
  579.     PROTECTED FUNCTION ProcessStart
  580.     LOCAL lnFileNo,lcFileName
  581.  
  582.     this.DisplayMessage()
  583.     this.ClearText()
  584.     this.DisplayText()
  585.     IF this.lAddFontRules
  586.         this.parent.pgfTransformer.ActivePage= ;
  587.                 this.parent.pgfTransformer.fpgRules.PageOrder
  588.         this.parent.pgfTransformer.fpgRules.lstSelectedRules.SetFocus()
  589.         this.parent.LockScreen=.T.
  590.     ELSE
  591.         this.parent.pgfTransformer.ActivePage= ;
  592.                 this.parent.pgfTransformer.fpgLog.PageOrder
  593.         this.parent.pgfTransformer.fpgLog.edtTransformerLog.SetFocus()
  594.     ENDIF
  595.     this.cFileName=''
  596.     this.nProcessedFileCount=0
  597.     DIMENSION this.aProcessedFiles[1]
  598.     this.aProcessedFiles=''
  599.     this.nTransformedFileCount=0
  600.     DIMENSION this.aFileList[MAX(this.nFileCount,1)]
  601.     this.aFileList=''
  602.     FOR lnFileNo = 1 TO this.nFileCount
  603.         lcFileName=ALLTRIM(this.parent.pgfTransformer.fpgFiles. ;
  604.                 lstSelectedFiles.List[lnFileNo])
  605.         this.aFileList[lnFileNo]=lcFileName
  606.     ENDFOR
  607.     this.HeaderText()
  608.     ENDFUNC
  609.     
  610.  
  611.     PROTECTED FUNCTION ProcessEnd
  612.  
  613.     this.FooterText()
  614.     this.LogToFile()
  615.     this.DisplayMessage(.NULL.)
  616.     ENDFUNC
  617.  
  618.  
  619.     PROTECTED FUNCTION ProcessFileList
  620.     LOCAL lnFileNo,lcFileName
  621.  
  622.     FOR lnFileNo = 1 TO this.nFileCount
  623.         IF this.parent.lError
  624.             RETURN .F.
  625.         ENDIF
  626.         lcFileName=this.aFileList[lnFileNo]
  627.         IF FILE(lcFileName)
  628.             IF NOT this.ProcessFile(lcFileName)
  629.                 RETURN .F.
  630.             ENDIF
  631.         ELSE
  632.             IF NOT this.ProcessFolder(lcFileName)
  633.                 RETURN .F.
  634.             ENDIF
  635.         ENDIF
  636.     ENDFOR
  637.     ENDFUNC
  638.  
  639.  
  640.     PROTECTED FUNCTION ProcessFolder(tcFolderName)
  641.     LOCAL lnFileCount,lnFileNo,lcFileName,lcAttrib
  642.     LOCAL laFiles[1,5]
  643.  
  644.     IF this.parent.lError OR (CHRSAW() AND INKEY('HM')=27)
  645.         RETURN .F.
  646.     ENDIF
  647.     this.DisplayMessage(tcFolderName)
  648.     lnFileCount=ADIR(laFiles,tcFolderName+'*.*','D')
  649.     IF lnFileCount=0
  650.         RETURN
  651.     ENDIF
  652.     FOR lnFileNo = 1 TO lnFileCount
  653.         lcFileName=laFiles[lnFileNo,1]
  654.         lcAttrib=laFiles[lnFileNo,5]
  655.         IF EMPTY(lcFileName) OR LEFT(lcFileName,1)=='.'
  656.             LOOP
  657.         ENDIF
  658.         lcFileName=LOWER(tcFolderName+lcFileName)
  659.         IF 'D'$lcAttrib
  660.             IF NOT this.lSearchSubfolders
  661.                 LOOP
  662.             ENDIF
  663.             lcFileName=lcFileName+'\'
  664.             IF NOT this.ProcessFolder(lcFileName)
  665.                 RETURN .F.
  666.             ENDIF
  667.         ELSE
  668.             IF NOT this.ProcessFile(lcFileName)
  669.                 RETURN .F.
  670.             ENDIF
  671.         ENDIF
  672.     ENDFOR
  673.     ENDFUNC
  674.  
  675.  
  676.     PROTECTED FUNCTION ProcessFile(tcFileName)
  677.     LOCAL lcFileName,lcFileExt,lcFileExt2,lcFileName,lcAttrib
  678.     LOCAL lcObjName,lcBaseClass,lcClasses,lnRecNo,lcGetFileList
  679.     LOCAL lnLastSelect,lcAlias,lnCount,llMatch,llWildCardMatch
  680.     LOCAL laFiles[1,5]
  681.  
  682.     IF this.parent.lError OR (CHRSAW() AND INKEY('HM')=27)
  683.         RETURN .F.
  684.     ENDIF
  685.     IF this.nProcessedFileCount>0 AND ;
  686.             ASCAN(this.aProcessedFiles,tcFileName+MARKER)>0
  687.         RETURN
  688.     ENDIF
  689.     lcFileName=LOWER(this.TrimPath(tcFileName))
  690.     IF this.nFileRuleCount>0
  691.         llMatch=.T.
  692.         FOR lnCount = 1 TO this.nFileRuleCount
  693.             llWildCardMatch=this.WildCardMatch(this.aFileRule[lnCount], ;
  694.                     lcFileName)
  695.             IF this.aExcludeFilesRule[lnCount]
  696.                 llWildCardMatch=(NOT llWildCardMatch)
  697.             ENDIF
  698.             IF NOT llWildCardMatch
  699.                 llMatch=.F.
  700.                 EXIT
  701.             ENDIF
  702.         ENDFOR
  703.         IF NOT llMatch
  704.             RETURN
  705.         ENDIF
  706.     ENDIF
  707.     lcGetFileList=LOWER(STRTRAN('|'+this.cGetFileExt,'|','.'))
  708.     lcFileExt=LOWER(RIGHT(tcFileName,4))
  709.     IF NOT lcFileExt$lcGetFileList OR ADIR(laFiles,tcFileName)=0
  710.         RETURN
  711.     ENDIF
  712.     this.nProcessedFileCount=this.nProcessedFileCount+1
  713.     DIMENSION this.aProcessedFiles[this.nProcessedFileCount]
  714.     this.aProcessedFiles[this.nProcessedFileCount]=tcFileName+MARKER
  715.     lcAttrib=laFiles[1,5]
  716.     IF NOT lcFileExt=='.pjx' AND LEFT(lcAttrib,1)=='R'
  717.         this.AddText('Unabled to process read-only file:  '+tcFileName,1)
  718.         RETURN
  719.     ENDIF
  720.     lnLastSelect=SELECT()
  721.     lcAlias='_'+SYS(3)
  722.     IF USED(lcAlias)
  723.         USE IN (lcAlias)
  724.     ENDIF
  725.     IF lcFileExt=='.pjx'
  726.         SELECT 0
  727.         USE (tcFileName) ALIAS (lcAlias)
  728.         IF NOT USED(lcAlias)
  729.             SELECT (lnLastSelect)
  730.             this.UnableToProcessFileText(tcFileName)
  731.             RETURN .F.
  732.         ENDIF
  733.         IF FCOUNT()#28
  734.             USE IN (lcAlias)
  735.             SELECT (lnLastSelect)
  736.             RETURN
  737.         ENDIF
  738.         SET FILTER TO NOT DELETED()
  739.         LOCATE
  740.         this.DisplayMessage(tcFileName)
  741.         this.AddText(PROJECT_LOC+tcFileName,1)
  742.         SCAN ALL FOR NOT Type=='H' AND NOT EMPTY(Name)
  743.             lcFileName=LOWER(ALLTRIM(STRTRAN(MLINE(Name,1),CHR(0),'')))
  744.             lcFileExt2=LOWER(RIGHT(lcFileName,4))
  745.             IF NOT lcFileExt2$lcGetFileList
  746.                 LOOP
  747.             ENDIF
  748.             lcFileName=LOWER(FULLPATH(lcFileName,tcFileName))
  749.             this.ProcessFile(lcFileName)
  750.         ENDSCAN
  751.         USE IN (lcAlias)
  752.         SELECT (lnLastSelect)
  753.         RETURN
  754.     ENDIF
  755.     SELECT 0
  756.     USE (tcFileName) ALIAS (lcAlias)
  757.     IF NOT USED(lcAlias)
  758.         SELECT (lnLastSelect)
  759.         this.UnableToProcessFileText(tcFileName)
  760.         RETURN .F.
  761.     ENDIF
  762.     SET FILTER TO NOT DELETED()
  763.     LOCATE
  764.     IF (INLIST(lcFileExt,'.vcx','.scx','.mnx') AND FCOUNT()#23) OR ;
  765.             (lcFileExt=='.frx' AND FCOUNT()#75)
  766.         USE IN (lcAlias)
  767.         SELECT (lnLastSelect)
  768.         RETURN
  769.     ENDIF
  770.     this.DisplayMessage(tcFileName)
  771.     this.nTransformedFileCount=this.nTransformedFileCount+1
  772.     this.cFileName=tcFileName
  773.     DO CASE
  774.         CASE lcFileExt=='.vcx'
  775.             this.AddText(CLASSLIB_LOC+tcFileName,1)
  776.         CASE lcFileExt=='.scx'
  777.             this.AddText(FORM_LOC+tcFileName,1)
  778.         CASE lcFileExt=='.mnx'
  779.             this.AddText(MENU_LOC+tcFileName,1)
  780.         CASE lcFileExt=='.frx'
  781.             this.AddText(REPORT_LOC+tcFileName,1)
  782.         OTHERWISE
  783.             SELECT (lnLastSelect)
  784.             this.cFileName=''
  785.             this.UnableToProcessFileText(tcFileName)
  786.             RETURN .F.
  787.     ENDCASE
  788.     SCAN ALL
  789.         IF lcFileExt=='.mnx'
  790.             this.ProcessMenuRules()
  791.             LOOP
  792.         ENDIF
  793.         IF lcFileExt=='.frx'
  794.             this.ProcessReportRules()
  795.             LOOP
  796.         ENDIF
  797.         IF EMPTY(Platform) OR Platform=='COMMENT '
  798.             LOOP
  799.         ENDIF
  800.         lcObjName=LOWER(ALLTRIM(MLINE(ObjName,1)))
  801.         lcBaseClass=LOWER(ALLTRIM(MLINE(BaseClass,1)))
  802.         IF INLIST(lcBaseClass,'dataenvironment','cursor','relation')
  803.             LOOP
  804.         ENDIF
  805.         IF this.nClassRuleCount>0
  806.             llMatch=.T.
  807.             IF EMPTY(lcBaseClass)
  808.                 LOOP
  809.             ENDIF
  810.             FOR lnCount = 1 TO this.nClassRuleCount
  811.                 lcClasses=LOWER(this.aClassRule[lnCount])
  812.                 llWildCardMatch=(this.WildCardMatch(lcClasses,lcBaseClass) OR ;
  813.                         this.WildCardMatch(lcClasses,lcObjName))
  814.                 IF this.aExcludeClassesRule[lnCount]
  815.                     llWildCardMatch=(NOT llWildCardMatch)
  816.                 ENDIF
  817.                 IF NOT llWildCardMatch
  818.                     llMatch=.F.
  819.                     EXIT
  820.                 ENDIF
  821.             ENDFOR
  822.             IF NOT llMatch
  823.                 LOOP
  824.             ENDIF
  825.         ENDIF
  826.         IF NOT this.lAddFontRules
  827.             IF NOT this.ProcessRules()
  828.                 USE IN (lcAlias)
  829.                 SELECT (lnLastSelect)
  830.                 this.cFileName=''
  831.                 RETURN .F.
  832.             ENDIF
  833.             LOOP
  834.         ENDIF
  835.         IF lcFileExt=='.scx'
  836.             LOCATE FOR Platform=='COMMENT ' AND UniqueID=='FONTINFO  '
  837.             IF NOT EOF()
  838.                 this.AddFontRules(lcFileName)
  839.             ENDIF
  840.             EXIT
  841.         ENDIF
  842.         lnRecNo=RECNO()
  843.         LOCATE FOR LOWER(ALLTRIM(MLINE(ObjName,1)))==lcObjName AND ;
  844.                 Platform=='COMMENT ' AND UniqueID=='FONTINFO  '
  845.         IF EOF()
  846.             GO lnRecNo
  847.             LOOP
  848.         ENDIF
  849.         this.AddFontRules(lcFileName,lcObjName)
  850.         GO lnRecNo
  851.     ENDSCAN
  852.     USE IN (lcAlias)
  853.     SELECT (lnLastSelect)
  854.     this.cFileName=''
  855.     ENDFUNC
  856.  
  857.  
  858.     PROTECTED FUNCTION AddFontRules(tcFileName,tcObjName)
  859.     LOCAL lcFileName,lcObjName,lcFontInfo,lnFontStyle
  860.     LOCAL lcProperties,oListBox,lcProperty,lcValue,lcCondition
  861.     LOCAL lcFontName,lcFontStyle,lnFontSize,lnHeight,lnWidth
  862.     LOCAL lcFontName2,lcFontStyle2,lnFontSize2,lnHeight2,lnWidth2
  863.     LOCAL lnFM1,lnFM5,lnFM6
  864.     LOCAL lnFontNo,lnFontSizeCount,lnFontSizeNo,lnAtPos
  865.     LOCAL laFont[1],laFonts[1]
  866.  
  867.     IF NOT AFONT(laFonts)
  868.         RETURN .F.
  869.     ENDIF
  870.     lcFileName=IIF(TYPE('tcFileName')=='C',tcFileName,'')
  871.     lcObjName=IIF(TYPE('tcObjName')=='C',tcObjName,'')
  872.     oListBox=this.parent.pgfTransformer.fpgRules.lstSelectedRules
  873.     lcProperties=STRTRAN(ALLTRIM(Properties),LF,CR_LF)
  874.     lcCondition=IIF(_windows,'_WINDOWS','_MAC')
  875.     _mline=0
  876.     DO WHILE .T.
  877.         lcFontInfo=ALLTRIM(MLINE(lcProperties,1,_mline))
  878.         IF EMPTY(lcFontInfo)
  879.             EXIT
  880.         ENDIF
  881.         IF NOT RIGHT(lcFontInfo,1)==','
  882.             lcFontInfo=lcFontInfo+','
  883.         ENDIF
  884.         lnAtPos=AT(',',lcFontInfo)
  885.         IF lnAtPos<=1
  886.             LOOP
  887.         ENDIF
  888.         lcFontName=ALLTRIM(LEFT(lcFontInfo,lnAtPos-1))
  889.         lcFontInfo=ALLTRIM(SUBSTR(lcFontInfo,lnAtPos+1))
  890.         lnAtPos=AT(',',lcFontInfo)
  891.         IF lnAtPos<=1
  892.             LOOP
  893.         ENDIF
  894.         lnFontStyle=VAL(LEFT(lcFontInfo,lnAtPos-1))
  895.         IF lnFontStyle=0
  896.             lcFontStyle='N'
  897.         ELSE
  898.             lcFontStyle=''
  899.             IF BITTEST(lnFontStyle,0)
  900.                 lcFontStyle=lcFontStyle+'B'
  901.             ENDIF
  902.             IF BITTEST(lnFontStyle,1)
  903.                 lcFontStyle=lcFontStyle+'I'
  904.             ENDIF
  905.         ENDIF
  906.         lcFontInfo=ALLTRIM(SUBSTR(lcFontInfo,lnAtPos+1))
  907.         lnAtPos=AT(',',lcFontInfo)
  908.         IF lnAtPos<=1
  909.             LOOP
  910.         ENDIF
  911.         lnFontSize=VAL(LEFT(lcFontInfo,lnAtPos-1))
  912.         lcFontInfo=ALLTRIM(SUBSTR(lcFontInfo,lnAtPos+1))
  913.         lnAtPos=AT(',',lcFontInfo)
  914.         IF lnAtPos<=1
  915.             LOOP
  916.         ENDIF
  917.         lnFM6=VAL(LEFT(lcFontInfo,lnAtPos-1))
  918.         lcFontInfo=ALLTRIM(SUBSTR(lcFontInfo,lnAtPos+1))
  919.         lnAtPos=AT(',',lcFontInfo)
  920.         IF lnAtPos<=1
  921.             LOOP
  922.         ENDIF
  923.         lnFM1=VAL(LEFT(lcFontInfo,lnAtPos-1))
  924.         lcFontInfo=ALLTRIM(SUBSTR(lcFontInfo,lnAtPos+1))
  925.         lnAtPos=AT(',',lcFontInfo,3)
  926.         IF lnAtPos<=1
  927.             LOOP
  928.         ENDIF
  929.         lcFontInfo=ALLTRIM(SUBSTR(lcFontInfo,lnAtPos+1))
  930.         lnAtPos=AT(',',lcFontInfo)
  931.         IF lnAtPos<=1
  932.             LOOP
  933.         ENDIF
  934.         lnFM5=VAL(LEFT(lcFontInfo,lnAtPos-1))
  935.         lcFontInfo=ALLTRIM(SUBSTR(lcFontInfo,lnAtPos+1))
  936.         IF AFONT(laFont,lcFontName,lnFontSize)
  937.             LOOP
  938.         ENDIF
  939.         lnHeight=FONTMETRIC(1,lcFontName,lnFontSize,lcFontStyle)+ ;
  940.                 FONTMETRIC(5,lcFontName,lnFontSize,lcFontStyle)
  941.         lnWidth=FONTMETRIC(6,lcFontName,lnFontSize,lcFontStyle)
  942.         FOR lnFontNo = 1 TO ALEN(laFonts)
  943.             lcFontName2=laFonts[lnFontNo]
  944.             IF NOT AFONT(laFont,lcFontName2)
  945.                 LOOP
  946.             ENDIF
  947.             lcFontStyle2=lcFontStyle
  948.             IF laFont[1]>0
  949.                 lnFontSizeCount=ALEN(laFont)
  950.                 lnFontSizeNo=0
  951.             ELSE
  952.                 lnFontSizeCount=0
  953.                 lnFontSizeNo=-1
  954.             ENDIF
  955.             DO WHILE .T.
  956.                 IF lnFontSizeCount>0
  957.                     lnFontSizeNo=lnFontSizeNo+1
  958.                     IF lnFontSizeNo>lnFontSizeCount
  959.                         EXIT
  960.                     ENDIF
  961.                     lnFontSize2=laFont[lnFontSizeNo]
  962.                 ELSE
  963.                     lnFontSizeNo=lnFontSizeNo+1
  964.                     IF lnFontSizeNo>8
  965.                         EXIT
  966.                     ENDIF
  967.                     IF lnFontSizeNo<=4
  968.                         lnFontSize2=lnFontSize+lnFontSizeNo
  969.                     ELSE
  970.                         lnFontSize2=lnFontSize-lnFontSizeNo
  971.                     ENDIF
  972.                 ENDIF
  973.                 lnHeight2=FONTMETRIC(1,lcFontName2,lnFontSize2,lcFontStyle2)+ ;
  974.                         FONTMETRIC(5,lcFontName2,lnFontSize2,lcFontStyle2)
  975.                 lnWidth2=FONTMETRIC(6,lcFontName2,lnFontSize2,lcFontStyle2)
  976.                 IF lnHeight2#lnHeight OR lnWidth2#lnWidth
  977.                     LOOP
  978.                 ENDIF
  979.             ENDDO
  980.         ENDFOR
  981.         IF oListBox.AddItem(this.parent.AddRule('FontName',lcFontName, ;
  982.                 lcCondition,lcFileName,,lcObjName))
  983.             this.nFontMatchCount=this.nFontMatchCount+1
  984.         ENDIF
  985.         IF oListBox.AddItem(this.parent.AddRule('FontSize', ;
  986.                 ALLTRIM(STR(lnFontSize)),lcCondition,lcFileName,,lcObjName))
  987.             this.nFontMatchCount=this.nFontMatchCount+1
  988.         ENDIF
  989.     ENDDO
  990.     ENDFUNC
  991.  
  992.  
  993.     PROTECTED FUNCTION ProcessRules
  994.     LOCAL lcItem,lcFileName,lcObjName,lcClass,lcBaseClass,lcParent
  995.     LOCAL llWildCardMatch,lnRuleNo,lnCount,lcText,lcObjectName,lnObjectCount
  996.     LOCAL lnPropertyAtPos,lnNameAtPos,lnAtPos,lnOccurance,lnStartPos,lnEndPos
  997.     LOCAL lcProperties,lcMembers,lcMember,lcOldExpr,lcNewExpr
  998.     LOCAL lcProperty,lcValue,lcCondition,lcFiles,llExcludeFiles
  999.     LOCAL lcClasses,llExcludeClasses,llOverridePropertyDefaults
  1000.     LOCAL laObjects[1]
  1001.  
  1002.     lcFileName=LOWER(this.TrimPath(this.cFileName))
  1003.     lcObjName=LOWER(ALLTRIM(MLINE(ObjName,1)))
  1004.     lcClass=LOWER(ALLTRIM(MLINE(Class,1)))
  1005.     lcBaseClass=LOWER(ALLTRIM(MLINE(BaseClass,1)))
  1006.     lcParent=LOWER(ALLTRIM(MLINE(Parent,1)))
  1007.     FOR lnRuleNo = 1 TO this.nRuleCount
  1008.         lcItem=this.aRules[lnRuleNo]
  1009.         this.parent.GetRule(lcItem)
  1010.         lcProperty=LOWER(this.parent.aRule[1])
  1011.         lcValue=this.parent.aRule[2]
  1012.         IF EMPTY(lcProperty) OR EMPTY(lcValue)
  1013.             LOOP
  1014.         ENDIF
  1015.         lcCondition=this.parent.aRule[3]
  1016.         lcFiles=LOWER(this.parent.aRule[4])
  1017.         llExcludeFiles=this.parent.aRule[5]
  1018.         lcClasses=LOWER(this.parent.aRule[6])
  1019.         llExcludeClasses=this.parent.aRule[7]
  1020.         llOverridePropertyDefaults=(this.lOverridePropertyDefaults OR this.parent.aRule[8])
  1021.         IF NOT EMPTY(lcFiles)
  1022.             llWildCardMatch=this.WildCardMatch(lcFiles,lcFileName)
  1023.             IF llExcludeFiles
  1024.                 llWildCardMatch=(NOT llWildCardMatch)
  1025.             ENDIF
  1026.             IF NOT llWildCardMatch
  1027.                 LOOP
  1028.             ENDIF
  1029.         ENDIF
  1030.         IF NOT EMPTY(lcClasses)
  1031.             llWildCardMatch=(this.WildCardMatch(lcClasses,lcBaseClass) OR ;
  1032.                     this.WildCardMatch(lcClasses,lcObjName))
  1033.             IF llExcludeClasses
  1034.                 llWildCardMatch=(NOT llWildCardMatch)
  1035.             ENDIF
  1036.             IF NOT llWildCardMatch
  1037.                 LOOP
  1038.             ENDIF
  1039.         ENDIF
  1040.         lcValue=this.FormatValue(lcProperty,lcValue)
  1041.         lcProperties=ALLTRIM(Properties)
  1042.         lcMembers=ALLTRIM(Reserved3)
  1043.         DIMENSION laObjects[1]
  1044.         laObjects=''
  1045.         lnObjectCount=0
  1046.         lnPropertyAtPos=-1
  1047.         lnNameAtPos=-1
  1048.         lnOccurance=0
  1049.         DO WHILE lnPropertyAtPos#0 OR lnNameAtPos#0
  1050.             IF this.parent.lError OR (CHRSAW() AND INKEY('HM')=27)
  1051.                 RETURN .F.
  1052.             ENDIF
  1053.             lcNewExpr=lcValue
  1054.             lnPropertyAtPos=0
  1055.             IF lnOccurance=0
  1056.                 lnPropertyAtPos=ATC(CR_LF+lcProperty+' = ',CR_LF+lcProperties+CR_LF)
  1057.                 lnOccurance=lnOccurance+1
  1058.                 lcObjectName=''
  1059.             ELSE
  1060.                 lnNameAtPos=ATC('.name = ',CR_LF+lcProperties+CR_LF, ;
  1061.                         lnOccurance)
  1062.                 lnOccurance=lnOccurance+1
  1063.                 IF lnNameAtPos=0
  1064.                     LOOP
  1065.                 ENDIF
  1066.                 lnNameAtPos=lnNameAtPos-1
  1067.                 lnAtPos=RAT(CR_LF,LEFT(lcProperties,lnNameAtPos))
  1068.                 lcObjectName=LOWER(SUBSTR(lcProperties,lnAtPos+2, ;
  1069.                         lnNameAtPos-lnAtPos-3))
  1070.                 IF lnObjectCount>0 AND ASCAN(laObjects,lcObjectName)>0
  1071.                     LOOP
  1072.                 ENDIF
  1073.                 lnPropertyAtPos=ATC(CR_LF+lcObjectName+'.'+lcProperty+' = ', ;
  1074.                         CR_LF+lcProperties+CR_LF)
  1075.                 lnObjectCount=lnObjectCount+1
  1076.                 DIMENSION laObjects[lnObjectCount]
  1077.                 laObjects[lnObjectCount]=lcObjectName
  1078.             ENDIF
  1079.              IF lnPropertyAtPos=0 AND NOT llOverridePropertyDefaults AND ;
  1080.                     ATC(CR_LF+lcProperty+CR_LF,CR_LF+lcMembers+CR_LF)=0
  1081.                 LOOP
  1082.             ENDIF
  1083.             lcText='    '+IIF(EMPTY(lcParent),'','    ')+lcObjName
  1084.             IF NOT EMPTY(lcObjectName)
  1085.                 lcText=lcText+'.'+lcObjectName
  1086.             ENDIF
  1087.             lcText=lcText+' ('+lcBaseClass+'):  '+lcItem
  1088.             IF this.lCreateLogOnly
  1089.                 this.AddText(lcText,1)
  1090.                 LOOP
  1091.             ENDIF
  1092.             lcOldExpr=''
  1093.             lnStartPos=0
  1094.             lnEndPos=0
  1095.             IF lnPropertyAtPos>0
  1096.                 lnStartPos=lnPropertyAtPos+LEN(lcProperty)-2
  1097.                 IF NOT EMPTY(lcObjectName)
  1098.                     lnStartPos=lnStartPos+LEN(lcObjectName)+1
  1099.                 ENDIF
  1100.                 DO WHILE .T.
  1101.                     lcOldExpr=SUBSTR(lcProperties,lnStartPos)
  1102.                     lnEndPos=AT(CR,lcOldExpr)
  1103.                     IF lnEndPos>0
  1104.                         EXIT
  1105.                     ENDIF
  1106.                     lcProperties=lcProperties+CR_LF
  1107.                 ENDDO
  1108.                 lcOldExpr=MLINE(SUBSTR(lcOldExpr,6),1)
  1109.                 lnEndPos=lnStartPos+lnEndPos
  1110.             ENDIF
  1111.             IF NOT EMPTY(lcCondition)
  1112.                 IF EMPTY(lcOldExpr)
  1113.                     lcOldExpr=PROPER(IIF(EMPTY(lcClass),lcBaseClass, ;
  1114.                             lcClass))+'::'+lcProperty
  1115.                 ENDIF
  1116.                 IF UPPER(LEFT(lcOldExpr,5))=='(IIF('
  1117.                     lnAtPos=AT(',',lcOldExpr)
  1118.                     IF lnAtPos>0
  1119.                         IF LOWER(lcCondition)==LOWER(SUBSTR(lcOldExpr,6,lnAtPos-6))
  1120.                             lnAtPos=RAT(',',lcOldExpr)
  1121.                             IF lnAtPos>0
  1122.                                 lcOldExpr=SUBSTR(lcOldExpr,lnAtPos+1, ;
  1123.                                         LEN(lcOldExpr)-lnAtPos-2)
  1124.                             ENDIF
  1125.                         ENDIF
  1126.                     ENDIF
  1127.                 ENDIF
  1128.                 IF lcNewExpr==lcOldExpr
  1129.                     lcNewExpr=this.FormatValue(lcProperty,lcNewExpr)
  1130.                 ELSE
  1131.                     lcNewExpr='(IIF('+lcCondition+','+lcNewExpr+','+ ;
  1132.                             lcOldExpr+'))'
  1133.                 ENDIF
  1134.             ENDIF
  1135.             IF lnStartPos>0
  1136.                 lcProperties=LEFT(lcProperties,lnStartPos+4)+lcNewExpr+ ;
  1137.                         SUBSTR(lcProperties,lnEndPos-1)
  1138.             ELSE
  1139.                 IF EMPTY(lcObjectName)
  1140.                     lnAtPos=ATC(CR_LF+'name = ',CR_LF+lcProperties+CR_LF)
  1141.                     lcObjectName=lcProperty
  1142.                 ELSE
  1143.                     lnAtPos=ATC(CR_LF+lcObjectName+'.name = ', ;
  1144.                             CR_LF+lcProperties+CR_LF)
  1145.                     lcObjectName=lcObjectName+'.'+lcProperty
  1146.                 ENDIF
  1147.                 IF lnAtPos>0
  1148.                     lcProperties=LEFT(lcProperties,lnAtPos-1)+ ;
  1149.                             lcObjectName+' = '+lcNewExpr+CR_LF+ ;
  1150.                             SUBSTR(lcProperties,lnAtPos)
  1151.                 ELSE
  1152.                     lcProperties=lcProperties+lcObjectName+' = '+lcNewExpr+CR_LF
  1153.                 ENDIF
  1154.             ENDIF
  1155.         ENDDO
  1156.         DO WHILE LEFT(lcProperties,2)==CR_LF
  1157.             lcProperties=SUBSTR(lcProperties,3)
  1158.         ENDDO
  1159.         IF NOT Properties==lcProperties
  1160.             REPLACE Properties WITH lcProperties
  1161.             this.AddText(lcText,1)
  1162.         ENDIF
  1163.     ENDFOR
  1164.     ENDFUNC
  1165.  
  1166.  
  1167.     PROTECTED FUNCTION ProcessMenuRules
  1168.     ENDFUNC
  1169.  
  1170.  
  1171.     PROTECTED FUNCTION ProcessReportRules
  1172.     ENDFUNC
  1173.  
  1174.  
  1175. ENDDEFINE
  1176.  
  1177. *-- end TRANSFRM.PRG
  1178.